Convert_str_to_value proc far    
    ; 函数：将ax位长度的字符串转换为整数
    ; 参数：ds:si 读取数据的位置 ax:要转换的的字符串的长度(1~5位) 或者到达 00 位置
    ; 返回值：将录入的数据存放在ax中 范围：(0 ~ 65535) 不改变其它寄存器的内容
    ; 错误时返回bx = 0BADh 不清除已写入内容

    
    push si
    push cx
    push dx   
    

str_to_value_start:
    mov cx,ax   ;cx存放长度
    xor ax,ax   ;ax存放结果
    xor bx,bx   ;bx存放当前数字
    xor dx,dx   ;dx置0



str_to_value_cycle:

    mov bl,ds:[si]
    cmp bx,00h  ;遇到00则提前结束
    jz str_to_value_done
    push dx
    push cx
    mov cx,0Ah
    mul cx
    cmp dx,0h
    jnz str_to_value_overflow_error ;检查乘法结果是否超过32位

    pop cx
    pop dx
    xor bh,bh

    ; 检查是否为数字ascii
    cmp bl,30h
    jb str_to_value_string_error
    cmp bl,39h
    ja str_to_value_string_error


    sub bx,30h
    add ax,bx
    inc si
    loop str_to_value_cycle
    

str_to_value_done:
    pop dx   
    pop cx
    pop si
    retf


str_to_value_overflow_error:
    pop dx
    pop cx
    dispmsg str_to_value_mul_overflow_error
    mov ax,0BADh
    jmp str_to_value_error_done

str_to_value_string_error:
    dispmsg str_to_value_parameter_error
    mov ax,0BADh
    jmp str_to_value_error_done

str_to_value_error_done:
    mov bx,0BADh
    pop dx   
    pop cx
    pop si
    retf

Convert_str_to_value endp







;================================================================



display_ax_dec proc far 
; 以10进制打印ax的值
; 参数：ax,不改变其它寄存器
; 返回值: ax 打印出字符的长度

    push bx
    push cx
    push dx
    push si
    push ds

    mov_dssi_to_cache_area

    push si
    mov dx,'$'
    push dx
 
    mov cx,0h;cx计算转换字符串的长度
    xor dx,dx

    mov bx,0ah

display_ax_dec_cycle:
    div bx
    add dx,30h
    push dx
    inc cx
    
    cmp ax,0
    jz display_ax_dec_continue

    xor dx,dx
    jmp display_ax_dec_cycle
display_ax_dec_continue:



display_ax_dec_wirte:

    pop ax
    cmp ax,'$'
    jz display_ax_dec_display
    mov ds:[si],al
    inc si
    jmp display_ax_dec_wirte




display_ax_dec_display:
    mov ds:[si],al
    pop si
    mov dx,si
    mov ah, 9
    int 21h
display_ax_dec_done:

    clear_area_ds _8

    pop ax
    mov ds,ax
    mov ax,cx
    pop si
    pop dx
    pop cx
    pop bx
    retf
display_ax_dec endp
